#include "ChatMessageDelegate.h"
#include "ChatMessageModel.h"

#include <QTextDocument>


ChatMessageDelegate::ChatMessageDelegate(QObject *parent) : QStyledItemDelegate{parent}{}

void ChatMessageDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    painter->save(); // 保存绘制状态

    // 设置抗锯齿和文字渲染优化
    painter->setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);

    // 从模型获取数据
    bool isSend = index.data(ChatMessageModel::IsSendRole).toBool();
    QString content = index.data(ChatMessageModel::ContentRole).toString();
    QString avatarPath = index.data(ChatMessageModel::AvatarRole).toString();
    int msgType = index.data(ChatMessageModel::MsgTypeRole).toInt();

    // 计算布局区域 ------------------------------
    QRect avatarRect;  // 头像区域
    QRect bubbleRect;  // 气泡区域
    const int avatarSize = 40; // 头像尺寸
    const int bubbleWidth = 200; // 气泡基础宽度

    if (isSend)
    {
        // 发送方布局（右侧）
        avatarRect = QRect(
            option.rect.right() - avatarSize - 10, // x坐标：右侧留10px边距
            option.rect.top(),                // y坐标：顶部留5px
            avatarSize,
            avatarSize
            );
        bubbleRect = QRect(
            avatarRect.left() - bubbleWidth - 10, // 气泡在头像左侧
            option.rect.top(),
            bubbleWidth,
            option.rect.height()
            );
    }
    else
    {
        // 接收方布局（左侧）
        avatarRect = QRect(
            option.rect.left() + 10,
            option.rect.top(),
            avatarSize,
            avatarSize
            );
        bubbleRect = QRect(
            avatarRect.right() + 10,
            option.rect.top(),
            bubbleWidth,
            option.rect.height()
            );
    }

    // 绘制头像 ----------------------------------
    drawAvatar(painter, avatarRect, avatarPath);

    // 绘制消息气泡 ------------------------------
    switch(msgType) {
    case 0: // 文字消息
        drawTextBubble(painter, bubbleRect, content, isSend);
        break;
    case 1: // 图片消息
        drawImageBubble(painter, bubbleRect, content);
        break;
    }

    painter->restore(); // 恢复绘制状态
}

QSize ChatMessageDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    // 基础尺寸计算
    QSize baseSize;
    const int baseBubbleWidth = 200;  // 气泡基础宽度
    const int verticalMargin = 20;    // 上下边距总和
    const int bottomSpacing = 5;      // 底部留白高度

    // 获取消息类型
    const int msgType = index.data(ChatMessageModel::MsgTypeRole).toInt();

    if (msgType == 1) {  // 图片消息
        QString path = index.data(ChatMessageModel::ContentRole).toString();
        QPixmap image;

        if (QPixmapCache::find(path, &image)) {
            // 计算缩放尺寸（与绘制逻辑保持一致）
            const int maxContentWidth = baseBubbleWidth - 10;  // 减去气泡内边距
            const QSize scaledSize = image.size().scaled(
                maxContentWidth, 300, Qt::KeepAspectRatio  // 最大高度300px
                );
            baseSize = QSize(300, scaledSize.height() + verticalMargin);
        } else {
            baseSize = QSize(300, 150);  // 默认图片高度
        }
    }
    else {  // 文字消息（包含默认类型）
        // 获取消息内容
        const QString text = index.data(ChatMessageModel::ContentRole).toString();
        // 设置字体和文本内容
                // 更新布局
         QFont font("Arial", 12);
        QTextDocument doc;
        // 创建并配置 QTextDocument
        doc.setDefaultFont(font);
        doc.setPlainText(text);
        doc.setDocumentMargin(0);
        doc.setTextWidth(200.0); // 设置自动换行宽度
        doc.adjustSize();
        // 获取最终尺寸
        baseSize = doc.size().toSize();


        // // 计算文本尺寸
        // const QFontMetrics fm(option.font);
        // const QRect textRect = fm.boundingRect(
        //     QRect(0, 0, baseBubbleWidth - 10, 2000),  // 限制宽度并允许高度扩展
        //     Qt::TextWordWrap | Qt::AlignTop,          // 顶部对齐
        //     text
        //     );

        // baseSize = QSize(300, textRect.height() + verticalMargin);
    }

    // 如果是最后一项，增加底部留白
    if (index.isValid() && index.row() == index.model()->rowCount() - 1)
    {
        baseSize.setHeight(baseSize.height() + bottomSpacing);
    }

    return baseSize;
}

void ChatMessageDelegate::drawAvatar(QPainter *painter, const QRect &rect, const QString &path) const
{
    // 加载头像（使用缓存优化）
    QPixmap avatar;
    if (!QPixmapCache::find(path, &avatar)) {
        avatar.load(path);
        QPixmapCache::insert(path, avatar);
    }

    // 创建圆形遮罩
    QPainterPath clipPath;
    clipPath.addEllipse(rect);

    painter->save();
    painter->setClipPath(clipPath);
    painter->drawPixmap(rect, avatar);
    painter->restore();
}

void ChatMessageDelegate::drawTextBubble(QPainter *painter, QRect rect, const QString &text, bool isSend) const
{

    QFont font("Arial", 12);
    QTextDocument doc;
    // 创建并配置 QTextDocument
    doc.setDefaultFont(font);
    doc.setPlainText(text);
    doc.setDocumentMargin(0);
    doc.setTextWidth(200.0); // 设置自动换行宽度
    doc.adjustSize();
    // 获取最终尺寸
    QSize size = doc.size().toSize();

    // 设置气泡颜色
    QColor bubbleColor = isSend ? QColor("#95EC69") : Qt::white;

    // 绘制气泡背景
    QPainterPath path;
    path.addRoundedRect(rect, 8, 8); // 8px圆角

    // 绘制小三角形
    if (isSend) {
        path.moveTo(rect.right(), rect.top() + 10);
        path.lineTo(rect.right() + 8, rect.top() + 15);
        path.lineTo(rect.right(), rect.top() + 20);
    } else {
        path.moveTo(rect.left(), rect.top() + 10);
        path.lineTo(rect.left() - 8, rect.top() + 15);
        path.lineTo(rect.left(), rect.top() + 20);
    }

    painter->fillPath(path, bubbleColor);

    // 绘制文字（留5px边距）
    QRect textRect = rect.adjusted(5, 5, -5, -5);
    painter->setPen(Qt::black);
    // painter->drawText(textRect, Qt::TextWordWrap, text);
    doc.drawContents(painter,QRectF(5,5,doc.size().width(),doc.size().height()));
}

void ChatMessageDelegate::drawImageBubble(QPainter *painter, QRect rect, const QString &imagePath) const
{
    // 1. 加载图片（带缓存和错误处理）
    QPixmap image;
    if (!QPixmapCache::find(imagePath, &image))
    {
        if (image.load(imagePath))
        {
            QPixmapCache::insert(imagePath, image);
        }
        else
        {
            // 加载失败时显示占位图
            image = QPixmap(":/icons/broken_image.png");
        }
    }

    // 2. 计算缩放后的尺寸（保持宽高比）
    int maxWidth = rect.width() - 10;  // 左右留5px边距
    int maxHeight = 300;              // 最大图片高度
    QSize scaledSize = image.size().scaled(maxWidth, maxHeight, Qt::KeepAspectRatio);

    // 3. 绘制气泡背景
    QPainterPath bubblePath;
    bubblePath.addRoundedRect(rect, 8, 8);
    painter->fillPath(bubblePath, Qt::white);

    // 4. 绘制图片（居中显示）
    QRect imageRect(
        rect.left() + (rect.width() - scaledSize.width())/2,
        rect.top() + 5, // 顶部留5px
        scaledSize.width(),
        scaledSize.height()
        );
    painter->drawPixmap(imageRect, image);

    // 5. 绘制图片边框（可选）
    painter->setPen(QColor(200, 200, 200));
    painter->drawRoundedRect(imageRect.adjusted(-1,-1,1,1), 4, 4);
}
